#include <iostream>
#include <fstream>
#include <stdio.h>
#include <math.h>
#include <vector>
#include "../ArchivoDeBloques/Bloque.h"
#include "Key.h"
#include "../Util/Util.h"
using namespace std;

#ifndef SRC_BUCKET_H_
#define SRC_BUCKET_H_

class Bucket {

private:

	//Cantidad de bytes libres que tiene el bucket
	int cantBytesLibres;

	//Cantidad de referencias al bloque desde la tabla de hash, es el td
	int tamDispersionBucket;

	//Referencia al bloque con tamanio de dispersion y clave
	Bloque* bloque;

public:
	//Vector de keys
	vector<Key*> vectorKeys;

	/*Inicializa el bucket con el tamanio del bucket,
	 * la cantBytesLibres coincide con el tamanio del bucket cuando se crea
	 * */
	Bucket(unsigned int tamaniobucket,Bloque* bloque);

	virtual ~Bucket();

	/* True si la key existe en el bucket, sino false
	 * */
	bool existe (Key key);

	/* True si no hay lugar para insertar la key y desborda, sino false
	 * */
	bool desborda (Key key);

	/* Inserta key en el bucket y actualiza td, primer registro del bucket
	 * */
	bool insertar (Key key, unsigned int tamtabla);

	/* Elimina la key del bucket y actualiza td, primer registro del bucket 
	* */
	bool borrar (Key key, unsigned int tamtabla);

	/* busca la key si la encuentra y entra modifica el bucket, sino usa un nuevo bucket o uno libre si lo hay
	 * */
	bool modificar (Key key, unsigned int tamtabla);

	/* devuelve la cantidad de bytes libres que tiene el bucket
	 * */
	unsigned int obtenerCantidadBytesLibres();

	/*devuelve el tamaño de dispersion td del bucket
	 * */
	int obtenerTamanioDispersion();

	/*modifica el tamaño de dispersion td del bucket
	 * */
	void modificarTamanioDispersion(int tamanioDispersion);

	/* devuelve el bloque
	 * */
	Bloque * obtenerBloque();

	//Obtiene clave del buffer los primeros cuatro bytes
	int obtenerClave(string buffer);

	//Obtiene valor del buffer, el string
	std::string obtenerValor(string buffer);

	vector<Key*>  obtenerVector();

	/*busca el valor de una key, devuelve el string de la key*/
	string buscar(Key key);

	/*devuelve la cantidad de keys del bucket*/
	int obtenerCantidadKeys();
};

#endif /* SRC_BUCKET_H_ */
